//
//  ViewController.m
//  UI25_多线程
//
//  Created by dllo on 16/8/17.
//  Copyright © 2016年 yh. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()
@property (strong, nonatomic) IBOutlet UIImageView *picImageView;

@end

@implementation ViewController
- (IBAction)click:(id)sender {
    for (NSInteger i = 0; i < 10000; i++) {
        NSLog(@"打印第%ld次", i);
    }
}

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    // 进程: 进程是实体的运行过程，是系统进行资源分配和调度的一个独立单位。进程是当用户下达执行应用程序的命令时 就会启动的东西
    // 线程: 线程是进程的执行单位 线程是工人 进程是工厂
    // iOS下的多线程(为了更好地执行程序的操作 多个线程同时操作节省时间 增加效率 一个进程也不可以过多创建线程 这样资源消耗过大 合理的线程数目为5个左右 所有UI的操作都放在主线程中执行)
    // 需要开辟线程的操作: 图像渲染 大数据存储 网路请求
    // 1. NSThread
    // 获取当前线程 <NSThread: 0x7fb359507770>{number = 1, name = main} {线程编号, 线程名} main代表主线程
    NSThread *thread = [NSThread currentThread];
    // 主线程可以改名 默认是main
    thread.name = @"first";
    NSLog(@"%@", thread);
    // 开辟一个子线程(开辟的子线程编号随机)(10.0 还有一个block创建子线程的方法)
    //    [NSThread sleepForTimeInterval:10];
    [NSThread detachNewThreadSelector:@selector(newThread) toTarget:self withObject:nil];
    // 当前线程优先级(默认线程优先级为0.5)
//    double a = [NSThread threadPriority];
//    NSLog(@"%lf", a);
    // 类调用 判断当前线程是否为主线程
    [NSThread isMainThread];
    // 线程对象调用 判断线程对象是否为主线程
    [thread isMainThread];
    // 不论在哪 直接获取主线程(类调用)
    [NSThread mainThread];
    
    

    
    // 初始化方法 初始化一个未启动的线程 (创建好了 一个线程 但是不会自动执行 需要手动启动)
 //   NSThread *newThread = [[NSThread alloc] initWithTarget:self selector:@selector(myThread) object:nil];
    // 启动执行线程
//    [newThread start];
    // 将耗时操作放在任意线程
//    [self performSelectorInBackground:@selector(handImage) withObject:nil];
    
}

- (void)handImage {
    
    NSURL *imageUrl = [NSURL URLWithString:@"http://pic1.win4000.com/wallpaper/8/511ce1c9ee276.jpg"];
    NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:imageUrl];
    urlRequest.HTTPMethod = @"GET";
    // NSURLSession 网络请求
    // 参数
    // 1. request
    // 2. block快 callBack 回调
    // 注意 session的回调处于异步线程 需要返回主线程刷新UI(图片赋值 tableView collectionVIew刷新)
    
    NSURLSession *urlSession = [NSURLSession sharedSession];
    // NSLog(@"%p", urlSession); 单例验证方法 地址不变
    NSURLSessionDataTask *dataTask = [urlSession dataTaskWithRequest:urlRequest completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        // 主线程加载图片
    }];
    [dataTask resume];

    
//    NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://pic1.win4000.com/wallpaper/8/511ce1c9ee276.jpg"]];
////    self.picImageView.image = [UIImage imageWithData:data]; 这个 赋值的操作应该拿到主线程来进行
//    // 返回主线程 显示图片
//    [self performSelectorOnMainThread:@selector(onMain:) withObject:data waitUntilDone:YES];
}

- (void)myThread {
    NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://pic1.win4000.com/wallpaper/8/511ce1c9ee276.jpg"]];
    //    self.picImageView.image = [UIImage imageWithData:data]; 这个 赋值的操作应该拿到主线程来进行
    // 返回主线程 显示图片
    [self performSelectorOnMainThread:@selector(onMain:) withObject:data waitUntilDone:YES];

//    NSLog(@"%s", __FUNCTION__);
//    [NSThread exit];
}

- (void)onMain:(id)object {
    self.picImageView.image = [UIImage imageWithData:object];
}

- (void)newThread {
    NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://pic1.win4000.com/wallpaper/8/511ce1c9ee276.jpg"]];
    //    self.picImageView.image = [UIImage imageWithData:data]; 这个 赋值的操作应该拿到主线程来进行
    // 返回主线程 显示图片
    [self performSelectorOnMainThread:@selector(onMain:) withObject:data waitUntilDone:YES];
    
    // 退出当前线程(不执行后面的打印操作)
//    [NSThread exit];
    NSLog(@"我们都爱陈奕迅");
    // 延时当前操作 (十秒之后在进行下面操作 给一个固定时间)
//    NSDate *date = [NSDate dateWithTimeIntervalSinceNow:10];
//    [NSThread sleepUntilDate:date];
//    NSLog(@"1211127");
    // 获取当前线程
    NSThread *thread = [NSThread currentThread];
    // 给线程取名
    thread.name = @"sec";
    NSLog(@"newThread: %@", thread);
    NSLog(@"%lf", [NSThread threadPriority]);
}



- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
